﻿/*
  KeePass Password Safe - The Open-Source Password Manager
  Copyright (C) 2003-2017 Dominik Reichl <dominik.reichl@t-online.de>

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;

using KeePassLib.Resources;
using KeePassLib.Utility;

namespace KeePassLib.Serialization
{
  public static class IocKnownProtocols
  {
    public const string Http = "HTTP";
    public const string Https = "HTTPS";
    public const string WebDav = "WebDAV";
    public const string Ftp = "FTP";
  }

  public static class IocKnownProperties
  {
    public const string Timeout = "Timeout";
    public const string PreAuth = "PreAuth";

    public const string UserAgent = "UserAgent";
    public const string Expect100Continue = "Expect100Continue";

    public const string Passive = "Passive";
  }

  public static class IocPropertyInfoPool
  {
    private static List<IocPropertyInfo> m_l = null;
    public static IEnumerable<IocPropertyInfo> PropertyInfos
    {
      get { EnsureInitialized(); return m_l; }
    }

    private static void EnsureInitialized()
    {
      if (m_l != null) return;

      string strGen = KLRes.General;
      string strHttp = IocKnownProtocols.Http;
      string strHttps = IocKnownProtocols.Https;
      string strWebDav = IocKnownProtocols.WebDav;
      string strFtp = IocKnownProtocols.Ftp;

      string[] vGen = new string[] { strGen };
      string[] vHttp = new string[] { strHttp, strHttps, strWebDav };
      string[] vFtp = new string[] { strFtp };

      List<IocPropertyInfo> l = new List<IocPropertyInfo>();

      l.Add(new IocPropertyInfo(IocKnownProperties.Timeout,
          typeof(long), KLRes.Timeout + " [ms]", vGen));
      l.Add(new IocPropertyInfo(IocKnownProperties.PreAuth,
          typeof(bool), KLRes.PreAuth, vGen));

      l.Add(new IocPropertyInfo(IocKnownProperties.UserAgent,
          typeof(string), KLRes.UserAgent, vHttp));
      l.Add(new IocPropertyInfo(IocKnownProperties.Expect100Continue,
          typeof(bool), KLRes.Expect100Continue, vHttp));

      l.Add(new IocPropertyInfo(IocKnownProperties.Passive,
          typeof(bool), KLRes.Passive, vFtp));

      // l.Add(new IocPropertyInfo("Test", typeof(bool),
      //	"Long long long long long long long long long long long long long long long long long long long long",
      //	new string[] { "Proto 1/9", "Proto 2/9", "Proto 3/9", "Proto 4/9", "Proto 5/9",
      //	"Proto 6/9", "Proto 7/9", "Proto 8/9", "Proto 9/9" }));

      m_l = l;
    }

    public static IocPropertyInfo Get(string strName)
    {
      if (string.IsNullOrEmpty(strName)) { Debug.Assert(false); return null; }

      EnsureInitialized();
      foreach (IocPropertyInfo pi in m_l)
      {
        if (pi.Name.Equals(strName, StrUtil.CaseIgnoreCmp))
          return pi;
      }

      return null;
    }

    public static bool Add(IocPropertyInfo pi)
    {
      if (pi == null) { Debug.Assert(false); return false; }

      // Name must be non-empty
      string strName = pi.Name;
      if (string.IsNullOrEmpty(strName)) { Debug.Assert(false); return false; }

      IocPropertyInfo piEx = Get(strName); // Ensures initialized
      if (piEx != null) { Debug.Assert(false); return false; } // Exists already

      m_l.Add(pi);
      return true;
    }
  }
}
